<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="T0oPW" id="T0oPW"><span data-lake-id="u74d5ea28" id="u74d5ea28">典型回答</span></h1>
  <p data-lake-id="u461e4f70" id="u461e4f70"><br></p>
  <p data-lake-id="u9c6e540d" id="u9c6e540d"><span data-lake-id="u1c81d380" id="u1c81d380">MySQL的查询缓存是一种数据库性能优化技术，它允许MySQL在执行SELECT时将查询结果缓存起来，以便在以后相同的查询被再次执行时，可以直接返回缓存的结果，而不必再次重新解析和执行该语句。</span></p>
  <p data-lake-id="u8bd9fdbe" id="u8bd9fdbe"><span data-lake-id="u2728809b" id="u2728809b">​</span><br></p>
  <p data-lake-id="u98d2e6e5" id="u98d2e6e5"><span data-lake-id="u1b40882f" id="u1b40882f">查询缓存在session之间</span><strong><span data-lake-id="ub4f714e5" id="ub4f714e5">共享</span></strong><span data-lake-id="ufeca94a0" id="ufeca94a0">，因此由一个客户端生成的结果集可以用来响应另一个客户端发出的相同查询。</span></p>
  <p data-lake-id="uf413c330" id="uf413c330"><span data-lake-id="uec5eef97" id="uec5eef97">​</span><br></p>
  <p data-lake-id="uaaa4cb1b" id="uaaa4cb1b"><span data-lake-id="ue01646a1" id="ue01646a1">查询缓存可以提高查询性能，尤其是具有不经常更改的表且服务器接收到许多相同查询的环境中非常有用。</span></p>
  <p data-lake-id="ub99a2455" id="ub99a2455"><span data-lake-id="u7c173d05" id="u7c173d05">​</span><br></p>
  <p data-lake-id="u55662d0e" id="u55662d0e"><span data-lake-id="u8a3a1907" id="u8a3a1907">但是查询缓存是存在一定的限制的，如：</span></p>
  <p data-lake-id="u266213e8" id="u266213e8"><span data-lake-id="u8159e208" id="u8159e208">​</span><br></p>
  <ol list="u83516729">
   <li fid="ub426307b" data-lake-id="u9c8c1a79" id="u9c8c1a79"><span data-lake-id="ud6c77515" id="ud6c77515">查询缓存是根据查询文本来匹配查询的。</span><strong><span data-lake-id="ue436386e" id="ue436386e">查询必须以字节级别完全匹配，包括大小写敏感性。</span></strong><span data-lake-id="uedcb7707" id="uedcb7707">如果查询文本不完全相同，查询将不会被缓存。</span></li>
   <li fid="ub426307b" data-lake-id="u134ac535" id="u134ac535"><span data-lake-id="ua580b375" id="ua580b375">包含非确定性函数的查询结果不会缓存，例如RAND()和NOW()。这是因为这些函数的结果在不同的执行之间可能会不同，因此无法缓存结果。</span></li>
   <li fid="ub426307b" data-lake-id="ube86b66a" id="ube86b66a"><span data-lake-id="u09c90333" id="u09c90333">如果查询涉及使用临时表，查询缓存将不会工作。这是因为临时表的存在会导致查询无法被缓存。</span></li>
   <li fid="ub426307b" data-lake-id="u7eb03970" id="u7eb03970"><span data-lake-id="u5cdda7d0" id="u5cdda7d0">查询缓存被设计成不提供陈旧的结果。对底层表的任何修改都会导致这些表的所有缓存失效。</span></li>
   <li fid="ub426307b" data-lake-id="uce523282" id="uce523282"><span data-lake-id="uabfd72f6" id="uabfd72f6">某些存储引擎可能不支持查询缓存，或者在特定情况下限制了其使用。例如，InnoDB存储引擎在某些情况下不使用查询缓存，以便支持多版本并发控制（MVCC）。</span></li>
  </ol>
  <p data-lake-id="u44f0b27d" id="u44f0b27d"><span data-lake-id="u671fcaf0" id="u671fcaf0">​</span><br></p>
  <p data-lake-id="uc7f0a110" id="uc7f0a110"><span data-lake-id="uc4d051e7" id="uc4d051e7">在MySQL 5.6之前，查询缓存默认开启的，但是从5.6开始，查询缓存已经默认禁用了！</span></p>
  <p data-lake-id="u244d3216" id="u244d3216"><span data-lake-id="ue67d7956" id="ue67d7956">​</span><br></p>
  <p data-lake-id="u336969fa" id="u336969fa"><span data-lake-id="u25281455" id="u25281455">但是，在MySQL 8.0中取消了查询缓存：</span><a href="https://dev.mysql.com/blog-archive/mysql-8-0-retiring-support-for-the-query-cache/" target="_blank" data-lake-id="u88bdd098" id="u88bdd098"><span data-lake-id="ucf2e9cc0" id="ucf2e9cc0">https://dev.mysql.com/blog-archive/mysql-8-0-retiring-support-for-the-query-cache/</span></a></p>
  <p data-lake-id="u32761353" id="u32761353"><span data-lake-id="u2ebad99b" id="u2ebad99b">​</span><br></p>
  <p data-lake-id="u4558a7cd" id="u4558a7cd"><span data-lake-id="u6e7b950e" id="u6e7b950e">主要原因是因为虽然他能带来一定的性能提升，但它也有一些明显的缺点，这些缺点导致了MySQL 8.0取消查询缓存的决定：</span></p>
  <p data-lake-id="u5092e63c" id="u5092e63c"><span data-lake-id="ub0b8c110" id="ub0b8c110">​</span><br></p>
  <ol list="ub2d12390">
   <li fid="u03ad38ea" data-lake-id="u83ad1394" id="u83ad1394"><span data-lake-id="u7f7024de" id="u7f7024de">频繁失效：查询缓存是以表级别为单位进行管理的，这意味着如果任何表中的数据发生变化，与该表相关的所有查询缓存都将被清除。这导致了缓存的频繁失效，减少了其效用。</span></li>
   <li fid="u03ad38ea" data-lake-id="u1d3dfc2e" id="u1d3dfc2e"><span data-lake-id="u9f6667e7" id="u9f6667e7">内存开销：查询缓存需要占用大量内存来存储查询文本和结果集，这对于具有大量查询和数据的数据库来说，会导致内存开销问题。</span></li>
   <li fid="u03ad38ea" data-lake-id="u78fd0bce" id="u78fd0bce"><strong><span data-lake-id="u94c01047" id="u94c01047">不一致性：有时查询结果可能会因为数据库中的数据更改而不再与缓存的结果匹配，这可能导致不一致性的问题。</span></strong></li>
   <li fid="u03ad38ea" data-lake-id="u419f96ef" id="u419f96ef"><span data-lake-id="u59c9ce1b" id="u59c9ce1b">查询分布不均匀：在某些情况下，查询缓存可能会导致性能下降，因为它不能很好地应对不均匀的查询分布。（部分频繁查询需要频繁更新缓存，不频繁的查询又无法命中缓存）</span></li>
  </ol>
  <p data-lake-id="ud4032d75" id="ud4032d75"><br></p>
  <p data-lake-id="u5bcd21f9" id="u5bcd21f9"><span data-lake-id="u0802d865" id="u0802d865">所以，MySQL 8.0决定取消查询缓存，以便提高整体性能和可维护性。</span></p>
 </body>
</html>